{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一.简介\n",
    "为了让学习器越发的不同，randomforest的思路是在bagging的基础上再做一次特征的随机抽样，大致流程如下：   \n",
    "![avatar](./source/10_randomforest.png)\n",
    "\n",
    "### 二.RandomForest：分类实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.chdir('../')\n",
    "from ml_models import utils\n",
    "from ml_models.tree import CARTClassifier\n",
    "import copy\n",
    "import numpy as np\n",
    "\n",
    "\"\"\"\n",
    "randomforest分类实现，封装到ml_models.ensemble\n",
    "\"\"\"\n",
    "\n",
    "class RandomForestClassifier(object):\n",
    "    def __init__(self, base_estimator=None, n_estimators=10, feature_sample=0.66):\n",
    "        \"\"\"\n",
    "        :param base_estimator: 基学习器，允许异质；异质的情况下使用列表传入比如[estimator1,estimator2,...,estimator10],这时n_estimators会失效；\n",
    "                                同质的情况，单个estimator会被copy成n_estimators份\n",
    "        :param n_estimators: 基学习器迭代数量\n",
    "        :param feature_sample:特征抽样率\n",
    "        \"\"\"\n",
    "        self.base_estimator = base_estimator\n",
    "        self.n_estimators = n_estimators\n",
    "        if self.base_estimator is None:\n",
    "            # 默认使用决策树\n",
    "            self.base_estimator = CARTClassifier()\n",
    "        # 同质分类器\n",
    "        if type(base_estimator) != list:\n",
    "            estimator = self.base_estimator\n",
    "            self.base_estimator = [copy.deepcopy(estimator) for _ in range(0, self.n_estimators)]\n",
    "        # 异质分类器\n",
    "        else:\n",
    "            self.n_estimators = len(self.base_estimator)\n",
    "        self.feature_sample = feature_sample\n",
    "        # 记录每个基学习器选择的特征\n",
    "        self.feature_indices = []\n",
    "\n",
    "    def fit(self, x, y):\n",
    "        # TODO:并行优化\n",
    "        n_sample, n_feature = x.shape\n",
    "        for estimator in self.base_estimator:\n",
    "            # 重采样训练集\n",
    "            indices = np.random.choice(n_sample, n_sample, replace=True)\n",
    "            x_bootstrap = x[indices]\n",
    "            y_bootstrap = y[indices]\n",
    "            # 对特征抽样\n",
    "            feature_indices = np.random.choice(n_feature, int(n_feature * self.feature_sample), replace=False)\n",
    "            self.feature_indices.append(feature_indices)\n",
    "            x_bootstrap = x_bootstrap[:, feature_indices]\n",
    "            estimator.fit(x_bootstrap, y_bootstrap)\n",
    "\n",
    "    def predict_proba(self, x):\n",
    "        # TODO:并行优化\n",
    "        probas = []\n",
    "        for index, estimator in enumerate(self.base_estimator):\n",
    "            probas.append(estimator.predict_proba(x[:, self.feature_indices[index]]))\n",
    "        return np.mean(probas, axis=0)\n",
    "\n",
    "    def predict(self, x):\n",
    "        return np.argmax(self.predict_proba(x), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#造伪数据\n",
    "from sklearn.datasets import make_classification\n",
    "data, target = make_classification(n_samples=100, n_features=2, n_classes=2, n_informative=1, n_redundant=0,\n",
    "                                   n_repeated=0, n_clusters_per_class=1, class_sep=.5,random_state=21)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd4FNX6wPHvbN9N7wmp9B5C772pNKkqFiyIqFhRsTe8FtSr2FAsCIgoTZRepffeCS0JJCGk1+0zvz9yTcwvIIFsshDP53nu81yHmXPe3WzenD1z5j2SoigIgiAINYfK3QEIgiAIriUSuyAIQg0jErsgCEINIxK7IAhCDSMSuyAIQg0jErsgCEINIxK7IAhCDSMSuyAIQg0jErsgCEINo3FHpwGBXkpkVJA7uhYEQbhpHdx/LkNRlKsmT7ck9sioINZtmuyOrgVBEG5agV73JFbkPDEVIwiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDiMQuCIJQw4jELgiCUMOIxC4IglDDaCrbgCRJkcAsIBSQgemKokytbLuC++TlFrFqxT6SL6RRu044ffrH4eFhcHdYgiBUkCtG7A5goqIojYEOwOOSJDVxQbuCGyQmXOLhMR9w/sRaGoef4Miu5Txy/0ekp+e6OzRBECqo0oldUZRURVH2/e//5wPHgfDKtiu4xzdfLOb+kTreeKEWI4YE8f7rEdzaQ2bG9BXuDk0QhApy6Ry7JEkxQEtgpyvbFaqH3e5g3554htwWUOb4sIH+7Nh22E1RVS1Zlkk4d4mLF7PdHYoguEyl59j/IkmSJ7AQeFpRlLzL/Ps4YBxARGTA//9n4QagVqtQq1VYrDJ6fenf/CKzjF6ndWNkVWPXjng++/hXNJKZIrNMRHQkL7w6mtBQP3eHJgiV4pIRuyRJWoqT+hxFURZd7hxFUaYritJGUZQ2AYHeruhWcDGVSkX3Xq2YPvMSiqIAIMsK385Op2ffdpVq22y2sWPbSXbtiMdmc7gi3EpJvpDJlHdm8PozJhb+GMOSObXp2iqb1yZ9hyzL7g5PECql0oldkiQJ+B44rijKfysfkuBOjz4xmGMJ/ox+JJG3P0xh+P3nyLNGcd+Dfa67zU0bjjB6+FssnjuHeTNnc/eIt9m354wLo752K5buYlBfI63jvADQaCTuvSMItZzD4UOJbo1NECrLFVMxnYF7gcOSJB3437GXFUVZ7oK2hWrm5W1i6ldPcPhQIskXMrntjlAaNrr+e+FpaTl8OmUOX74fQsN6JgD2Hcxn0hs/MPOXV/HyMroq9GuSlZlD20ZlP/6SJBEZriUrs8AtMQmCq7hiVcwWRVEkRVFiFUWJ+9//RFK/iUmSRGyLGG4d0LpSSR3gzzWH6NtdX5LUAVq18KJ1cw1bNh2rbKjXrUmzuvy51Vwy5QRQUOhk3yEzjZtGuC0uQXAF8eSpUKWKiiz4ekvljvv5ShQVWd0QUbE+/eNIy/blzSnJ7DuYz4YtOUyYdJ5et3QWN0+Fm55I7EKVatO+AWs2WrBYSm9I5uU72LDVTNt29d0Wl8Gg4+PPHyc4pjuf/6ji1+WeDL5jFI89MchtMQmCq7hsuaMgXE7z2Ggax8Yx9umDDBvggcMB85cU0OfWbkRFB7k1Nk9PA/c90Jv7Hujt1jgEwdVEYheqlCRJTHxxJNu3xbJ140HUahWPT2xFqzZ13R2aINRYIrELVU6lUtG5S2M6d2ns7lAE4V9BzLELgiDUMCKxC4Ig1DAisQuCINQwYo5dqFGOHT3PTzNWEH8yiZAQf4aN6k3vfi3cHZYgVCsxYhdqjBPHL/D6pK/o1ymTOV+F8fh9Mj/PmMvihdvcHZogVCsxYhdqjF9mr2H8fV4MuqW4LHRggJb3X9Py+EsrGTikPRqNuuRcWZbZu/sMx49dICjYm+49m2Ey6d0VuiC4lBixCzXG6VPnadPSs8yxOjFGJMVGdnZpYS+r1c6Lz05nxlczUBdtZM/G33lw9HucPXOxukMWhCohRuxCjVErPIgTp3KJDC/deDvtkg2bQ4WPj0fJsQW/bsFLm8yXX0ajUhXXsfljRSaffPALn09/utrjFgRXEyN2ocYYcWdvPvs2h/2H8lEUhfPJFt6cksqgod3R6UrHMFs27uXukX4lSR1gYH9/UpNTxabdQo0gRuxCjdGuQwMefnw070xdSmbGRXR6PYOH9eDe+8vWgpGAv1XrFYQaRyR2wa3OnU1j+9YTaHUauvdsRnCwT6Xa69knlh69m1NYaMVo1KFWl/9S2rVnW2bPX0vzJh6o1aVTMWERtQgKqlz/gnAjEIldcJsfpq9i9bI/6dvdQJZFYfzMJTz21J306R9XqXYlScLT03DFfx8+qjOv7zvJPY8m0LmtnnPnnZw8o+a9/95VqX4F4UYhErvgFseOnmf9yj/5+ZsofLyLP4Z33G5m3MRfadehAd4+pqu0cP10Og3vffww+/ee5fixC3Rq6M2kyU0xGnVV1qcgVCeR2IXrkp1VwOoV+0hJuUTdepH06R93TevAN284xOD+ppKkDsVLE9u00LFj+0n63dKyKsIuIUkSrdrUFeWDhRpJrIoRrtnpU6mMu38KaefW0yzqJId2LOPRBz8mMyP/mtq50g1MSSq/lZ4gCBUnErtwzb6aupBH7zPyyrO1GDYoiA/eiKBHezuzZqyucBvdesbyx6oisnPsJcfOJJjZc9BGh44NqiJsQfjXEFMxwjUpKrISfyKRAe/WK3N86EA/Hn3hMDC8Qu00bhJJ34G9GP3Ievp0M2C2KGzcbuPJiXfh5V118+uC8G8gErtwTYqXD0pYrDKef6u9Ulgkozdor6mt+x/qR8/ecezYdpJAnYbp45sSGOTt4ogF4d9HJPZqJssyu3ee5uD+M/j6etK7XxwBgV7uDqvC9HotHTrH8t3sMzz1SCiSJOFwKHw3O4OefXtcc3vRMcFExwS7PlBB+BcTc+zVyG538MoL3zPz6x8J0O3mUsI6xo15j317z7g7tGsy4emh7D/hw+hHEnnzgxSGjTmHoqvHXff0cHdogiAgRuzVasXSvUjWRH78Irrkicc+3fKY/O4cZs9/FZXq5vg76+vnweffPMWhgwmkpmQz5J4w6tUPc3dYgiD8j0js1Wjb5v2MGuxdktQB2rbyxsOYzan4VBo2CndjdNdGkiRaxNWmRVxtd4dSIbIsYzbbMJn0YjmlUOOJxF6N1Bo1dkfZxduKomC3y5etaSJUnizLzP1pA7/N/xOrxYKfvw9jHhoktssTajSR2KtRj95tmTNvHp3beWM0Fq8oWbMhG0njQ916oW6OrmaaM2s9+7et59uPQ4kM13P4WCGvvTcXo0lPpy6N3B2eIFQJkdirUe++sRw6cIpRY/fSpb2B1DSZU+dUTJ4yTkwPVICiKKxeeYC1K7djMVto0yGW4aO6XLHgl8PhZPGCDfzwaRgRtYrLHcQ29eSZ8Q7m/LK2WhK7oig4nXKZbfkEoaqJxF6NVCoVEyeN5Mzprhw6mEDjth682qURev21rf/+t/rysz84eXAnD9zli7eXmt9XbGLiEweZOu0J1GoVRw4noSgKzWOj0Wo1FORbUJy2kqT+l0YNTKQmp1dprH9NAS1esIG83EJi6oTy4LghtBdP1QrVQCR2N6hbL1RMvVyj1NRs/ly1jUUzY/D0KB79xjX35NnXLjB92iq2bNhDWJCMhEJKupoXXrmXVm3qoDeYOHm6iIb1Sp9m3b0vn9r1Iqo03h+/W83RvZuY9kEI0ZHh7NiTx+R3f+DVd8YT2yKmSvsWBJfcsZMk6QdJki5JknTEFe0Jwv934tgFWrcwliR1KF6Z066ljgVzV/LOJG9++CyS7z+L4t2XvHn3rRnk5Zq554HbeOU/F9m+O5fMLDvL12Ty5Q953D2mf5XFarHYWLp4E++8XIva0UZUKolO7Xx47AEf5s9dV2X9CsJfXDVi/xH4ApjlovYEoQz/AE+Sku0oilLmfsSfm/Po3tFE67jSp3dbxnrRuU0eG/48zO3DOmDyMDJt9hrS0lKpVz+S198dTdNmUVUWa3ZWAR5GheCgsvXdmzYyMXPBxSrrVxD+4pLErijKJkmSYlzRliBcTvPYaJySL7N+SefukUGo1bD3QAE79lm4/w6/cucH+qsoyLcA0LN3c3r2bl5tsQYEelNoUZGcaiU8rHR+f9/BAmLqVO0UkCCAKCnwr6LcxDs4q1Qq3pnyMFv2+zHgrjMMG3OOyZ8W8cwLd7Fxuw2z2VlyrsUis26zmTbt6v1Di1VHp9Mw8q4+vPh2CoeOFlBQ6GTF2iy+m1PAnff0cUtMwr9Ltd08lSRpHDAOICIyoLq6/dcrXp2xkSWLNpKZlU+TptE8+Migm+aJ0b+z2xx4eBrIyXWQX6Ci760N6X9LHInnkhn37H5GDvZEkiTm/5FPbOtWbn2S9867e6DV6nj61WVkZuQQWiuIJ5+/+6Z6urimOXkimXVr9mG32enYuRlt29evscuMJVeN4v43FbNUUZRmVzs3rlUdZd2myS7pV/hn33y5lDNHt/P8hGCiIgz8uSWbj77K5b2Pn6B+w1ruDq/C8vOKGDfmQ0YPVTN0QABmi8z0mZc4dSGIjz9/lK1bTrBp/T4AuvVqRavWdVi76iBHDp7Ex9+XWwe0q9Z6NjnZhTw74XNqhxfRuZ2B0+fsrN5o4633H6nS+X3h8ub9vInF85cz9FYTRoPEH6uLqNe4Bc+/fMdNldwDve7ZqyhKm6udJ5Y71mAFBRZWLt3CvO8i8fcrXivft4c/mZkOFs7bwIuvjXZzhBW3euUBWjWXGT2iODkbjWomPVWLu8YlcuzoBbp1b0q37k2B4tc98YkvqRWQQ5/uHqSkJvHyszt4/JnRdO9VPXPtP/+0nnaxFp5/onROPa5ZNp99PI+vf5h4UyWTm116ei6/zF7OnK8jSm5oDx0oc/8Th9i/t22N3PfWVcsd5wLbgYaSJF2QJOkhV7QrVM6ltByCAtQlSf0vsU09SEpIcVNU1+fC+YvENi67ykSSJJo10nM+sezDRr8v2k7diFw+fCuCW3r78+A9Ifz37WC+nDofu91RLfHu3n6YIbf5ljnWs6sv6RcvkZVZUC0xCMX27DpNx7aGMquUDAYVt/U2smP7MTdGVnVctSrmLle0I7hWSKgv6ZkyWdn2Msn9wJFComIuP0pRFIV9e86wYf1+FFmmc7cWdOjU0O0jzJjatdi35yAjhpQeO3WmiOVrsrgnqgCbzYFOV/xx3rfrCA+N8i4Tc+OGHvh5ZXDuTBoN/jbPbbM5WLlsLzu3H8RgMNCnfzuXvF69QUthobPMMZtNweEEnU6UF6hOBoOOgkK53PGCQgWDXn+ZK25+YlVMDebhYeC2wV158e1k4s8UYbHIrFibxcx5hYy4s8dlr/l22nK+/Ph7GofH0zzmND9Om8V/pyxw+4qaPv3jOHpKy7ezLpKRaePFN0/zwOPH6NhazdE963jgrvdIOHcJAJOniezcsiNzp1MhN9+JVq9hy+Zj/LF4FyeOX+Clid+ya+MShvbOpkuLC3z3xUxmfFfxTbmvHG8nvpudhdVanFAURWHGz5do0aqR2NO1mrXv2IDDJ2T2H8ovOXYhxcqS1UX06hvnxsiqjstunl4LcfO0+siyzPy5m/njt41kZuTTtHkMD4wbSLPm0eXOTTh3iRee/Jhfv4vG26t49Gs2O7l7fBIvvPGo22/6paXl8P3Xy1i+dDeRoVamfRRDeLgvKpXE78szmbdcx7Tvn2XL5uPM+mY2X02JwN9Pi6IozP41nRUbDRQVWQgLshIdoWbdxlwsFhsbljRHoyke4+TkOhj5YCJfz3yZ4GCf647V6ZT56L1f2bvzAK1bGDmTYEOjD+KdKWPxD7h5tkKsKfbtOcN/3pxBgzoqTEaJvQetPPzYMAYMbufu0K5JRW+eisR+E8jPN7Nm5X4SE1KIjAqj/60tq2TUt2DeNtLPreaFJ8qulvl6Rgo2fRceGHt9a7ALCixkpOcREuqL0Vg6z5mTXci+vWfQ6jS0bVcPg0H3D62UeuHpadw5IJ/unUvnsGVZYci95/hg6nNERAYwa8ZaFs9fR7NGelLT7Kj1ATgdCqMG2Bg+OBCApKRMXv3PeYYNCuf2gUElbb00OZn2vYbRu2/la7YnJaZz8kQyIaG+NI+NdvuU1r+ZxWJj967T2G0O2rSth7fPzffNSayKqSFSU7OZ+PjnxDV1EtdUx6Fjhxn3y1o++nwC4RGufR7AZNSRm1f+D31OHgRGXftcpMPh5Osvl7J2xXb8/dTk5CoMu6M3d9/XiyWLd/HR5KV444dTcWA3FDHli3tp1frqKxScDgc6XdkEKUmg06mw2x1IksSYB/sy+PaOHD92AT9/D3x8PXhm/AcMHVgHgEvpNg4esdCto5FVf2aWSeyXMpx4u+gPZ1R0EFHRQVc/UahyBoOOrt2auDuMaiES+w3u26+WMPw2iftHF9/wGz4Yfpp3ielf/sFb7z3g0r66dm/Ct9MWceBwAXHNPQE4ebqIdZutfDMz9prbm/XDWlLP7GbhjCh8fTRcvGTjhTfXYbU6mfnVFloaO+Ch8wAgvTCdFybMZsn6l8uM6i+nQ5eWLFiyivatvVGpihP8jj15OBUTMbWDS87z8/csqbl+PikDrUaFoii8+3EiS1elU7+OlrOJNvLyFXLzHHh7qVm6KouMHEONXAIn/HuIxH6DSL6QSUZGHnXqhJSZZtm57SivTSg7Hz5sYADTfjxWriBWZXl5m3jlzQeZNHkmtSOz0WgkTpx28swLdxMUdG3zzbIss2TxJmZ9EYqvT/HHLDRYx7OPBvLES2sJcNYuSeoAQR5BJOd5smtHPN17/vMzboOHtmfH1sM8/HQSPbsYuJDq5M+tdl6dPPaKG4JHRAagM/rw4ttnOXkyhzlfBRMYoCE3z8EnX+fQa8hh6tT2Q6X14Z0pD4mtCoWbmkjsbpafb+a9t+dw+sQpIsP1nE20cfvI3tz3QB8kSUKn11BY5Cy5mQlQWOREr9dUyXxtm3b1mLPgdQ7sO4fTKfN66zpXHUFfjtXqwGqxEhpc9tqoCD0FBWZMSvmPnho1ZrPtqm3r9VqmfPoI27ae4PDBswRG+fDNw3EEBF75pqQkSTwz6S7G3PEW0z4IJCZKhywrmIw6Jj4eyKqNqTzx/FjiWtUW8+DCTU8kdjf79MMFRARc4L8/1UarVZGZZefJl9YTHhFMn34t6N2/Hd/8uJfXnw9HpZKQZYVvZl6iV7+2VRaTXq+t9E4/BoOWiKgQdu7No2Pb0tH+pm25NGlWh/i9F3HKdVCritd0m+1mcpRM2rarX6H21WoVXbs1ueycqSzL7Nwez9498Xh5mejbvyW1wgNoHhuNWq0iKkKPoqhQqyVUahW1QmQkyUl4pL9I6kKNIL5vulF+XhF7dh7mibEhaLXFP4oAfy3j7/djxR+bAXjw4VtIy63FqIcSeGtKKneMTSTpUihjx9/mztCvSpIkHnpkCG9/lMlvSzM4Hl/ET/MuMW1mAU8/P5LuAxuwO3cbp7NOcyLrJPsKd/DEC7f846i7IpxOmTdensns6bOI9DmIM2crT4z7kE0biveA0emNLFtbiFarRq1WIQGbdxbhcKgJDPR2wSsXBPcTI3Y3Kii04mFSYTKVfRIxOEhHbm7xwxQmk54PPnmEE8cvkHDuEv1HBNGkaeRNMbJs37EBb7z3GAt++ZMFK9KoXbcuH37Wi9p1Qnj9nVHsHnSKjeuOoTdo6D9goEsqH65fe4jC7NPM+Dwajab4Perfu4gnXp5L+45vMnREd35auJr8fIXO7Y2cTrDx7excevbveMX5eUG42YjE7kYhIT6oNB5lVqEArF6fS2yr0jXUkiTRuEkkjZtEuiPMSmnaLIqm74wpd1ySJNp1aEC7Dq7d3Hn75gMMG+BVktQBGtU3EROh4ujhJCY8M5i0tEyWrD3C5l35ZOcoNItrzhtv3+3SOATBnURidyOVSsX4J4bz0juzuGdEEbWj9WzeUcjW3So+/bqnu8O7KWl1WiwWZ7njZouMRqvGYNDx4aePcPpUKokJl4iKCrqpyhcLQkWIxO5mXbo1ITj4CZYs3sr2g5k0aNKCL77thJ+/59UvFsrp1bct0z87Qu/ufiUriTZsySGv0ECz5qUlEerVD6vW+uyCUJ1EYr8BNGgUzsQXR7k7jBqhXYf6HDnUjZEPbqBTWyMZWTKnEyUmfzBOzKEL/xoisQs1SvFqnFu5bVB79u05QxtvI+07NkSv1179YhdyOmVOHL+Aoig0ahyBRiNK9QrVRyR2Nzp0MIGZ3y3j5PEkAoO8uX1EL4YM63BTrHi50YXV8mfAYH+39H3wwDk+eHsWPl42JEkiO1fL86/eU6E6ONdjw/rDxXvaZubStHk97rq3NxGRgVXSl3BzEN9N3eTkiWQmv/INw/vns+KXGN5+zsS6ZUuYM2u9u0MTKiE/r4i3X/2el58y8dO0aGZ/FcUbEz145/UfyM0pdHl/C37dwuxvf+ae24v48DVP6gTH88zjU0lNyXJ5X8LNQyR2N5n38zrG3u1J/17+mExqmjb24L3Xwlj46zqsVru7w7uhKYpCTnbhDfk+bdpwlLYt1GWetm3bypvObTT8uf6wS/uyWu38PGsF/51ci26dfKkTY+T+0SEMvUXLvLkbXNqXcHMRUzFukngumXF3lF35Ehaix8sEGel5112SNykxnaV/7CAjLZOGjetw26A2lardLssy8+ZuZe6MrWRlFtCidTRPPHebSx4muh47tp3k269+IyszC1lW0bNvW8ZPGFThWu5VLT/fTFBA+am04ECJvFyzS/tKvpBJoB9E1CpbUrlLey8+mHbOpX0JNxcxYneTiMhQjhwr+9X8UrqNgiKue4edPbtOM/HxT/BV76dfp4ucj1/H4w9/SnbW9W+e/PVnq/ju/c3UymtIB4/uZO3WMf7e6SXb0FWnkyeS+e97PzJxnIY1C+qy4IdIrDkH+e8H86s9litp2bouG7dZsVhK99i02WTWb7HSqk0dl/YVEOBFeqaj3N6qp8+ZCQ4pOzBITc1m+dK9bNp49Ib8piO4lkjsbjLirl58MyuPzdtzkGWFswlmXn03hYG3d7uuaoqyLPPFJ/N46wV/Hrk/lL49/HlrUjhd2tj4efZ68vOKkOXyG/r+k/x8M7/O2kasdyv8jH5o1VpifKMJsIQz58dN19SWoiicO5vGqZMp1xzHXxYv2MSYUR60b1O8UbW/n5ZXngljz45DZKTnlTs/LS2HmT+s5ZMPF7BqxX5sNsdlWnWtho3Cad4qjvHPJbFibRYr1mYxfmIS9Zs0c/nWgj6+HnTs0pJ3P00hN6/4tR05Vsh3c/IYMqI7UPy+/zB9FRMeep/ju5ewcuGv3DvqHU4cv+DSWIQbi5iKcZNmzaN5/tWH+PbbJTz/Vjx+fh7cPqIvd97d/brau3QpF0tRHu1a1y5zvEt7LQ89uYw1K7ZgMnkweswtDBzSvkJtXkzNRocBg8ZQ5niAIYCTR5IrHNvZMxd5761ZWIuy0etVFFn0THzp7stuZnHubBqL5m3kQlIq0XUiGT6qG5FRxSs8Ll1Mp34vY5nzjUY14bV0pKfnEhhUWsRr394zvPvG9/TvoadJhIaNKw7yx6KNTPl0PB4eZV+Pq018cSQb/2zCuvV7URSFQXfcSq8+zatktdOTE4fx1Wcaho7ZjdEgodaYGPvYXcS1LP4c7Nl1mi3rNzD/h2h8vIt/3Tdty2HyqzOYNe8VUXe+hhKJ3Y3atq9P2/bPIstypR+eMRn1mC0yVquCwVCcQLKzCkhNySOumYGfptfjxKkiXnvvNwwGPX36X3139tBQX6yKBZvThk5d+i0i25JN04YhFYrLZnPw8sSvaR9nJzlJxuGQadlaYvJr3zF91otlNvA4fCiRt1/+htHDjAzpYWLfwaM8+9he/vPRYzRoFE7dhjHs2LOf1nGlU1UZmXYupDjKLO+TZZmpH/7Cm8/7ldzEHD5Y4bX3klk0fyv33t/7qnE7nTKLF+7gzzU7cDgctO8cx8g7u+HpaSjpIyuzAG8fEzpd2V8jlUpFz97N6dm7eYXeo8owGHQ8+8IIxk8YVDy/H+Rd5rO0fs0e7rzdsySpA3Tr5Mt3c5I4cjiRFnG1L9escJMTf65vAK54ItLbx0Rcq8ZMn5mGLBfvW3rhfA6LlhUw8vbi7eIa1TfxwoRAFvy6tsy1NpuDwkJLuTa9vE0MGdWGg7n7KbAVICsyyXnJXNIlMfr+rhWKa8f2k2RnZLN8gYP0vVHkHYrhj58VinILWL1if5lzv/tqMRMf8+a+O0NoGevFQ/eGMH6MBz9+txyAoSO6smStg5lz07iQYmX3vjwmvp7M4OE98fIqHclfOJ+J4iigQ5vSEbwkSQwf6MOubQcrFPd7b//Mnk3LmDBG5qXHtWSd38Kkp7/GZnOwfMleBvR4l2F9PqJfp7f58pPlOJ3XN73kKiaTnpAQ33KfJZvNjsFQ/vNlNEjYbeVr6gg1gxix1yDPvDCKt179keH3JxAdqWP1umTG3RfGoFtKR7MN65u4mHIeKF5z/eXU39m66QCKIlO3XgSPPT2izIqXp18YhK+fB3NnbiE/00yTZhF8+uID1G9QscJZJ08kczFJ5taIlmj+t6lGqBLA+pSdHDxwlrvv6wEUj4CPH0+i14dlqz326eHHJ9+cBiAszI9PvnyK2TNWs+CFeHz9vBg4bCi3Diy7abtOr8FskZFlUP/tgc+CQic6/dVXCJ0+lcqxQ0dYOCMGna44KTZtbGLCpPN889VKFvywh6bGOHwEFZF6AAAgAElEQVR9fTHbzfz+wyEAHn/mxquR36FzLL8tPEn/Xv4lFS/jzxRxNkmmWaxr5/yFG4dI7DWIr58H//3iMc6cvkhaWg5nkhbQvYuJLGtuyTkbt+UjBUlMP7iY5R/tplN9GzO+9cdkUrFhUzqPTviAga92xsv/b/PQnWBUxzgUGVRqid0cYvehQxWKaduFUxgs/qj+9uVQJUkYzMHIztI5Z0mS8PQ0knLRSmS4gXx7AVaHg9PnLNj0Nr499HvJubVGevPS629esc/QUD/CoyL49bd0Ro8o/rZSVOTkx7m59Lv96tMwJ45doFmsQp4zD/62QrFFSycff7mOZpq2+Bp8ATBqjTT1imX+nO08/Hi/ctMy7tarTyybN+znwSdP0b+nkcwsmWVrzTz57OgbZomo4Hpu+RSmF2bz9d5F7uj638MIYX0DePrtY4x/KJyW0T4cOJrPZ986aNvmMdLmGCF1FxPeaIBKlqAAerUK4HiHFI5/E0KbVrdcttlrnXDI8pyHTbeNc+ct+PupUUmQnStTqJjJDcwp8znwa+XNm5+c47VJwXh4qElNMfH5p3nU9R+JvKpXyXnmXj9f9fNTa4g/n3+RwPxVGURFaNi930JwszASQhL4em/iP16bmJ1JWoIVS44Peql0yH/yWBGWgkJsRoVLhdllrskuKODzzfPx8NX//+bcLnSYN7YjMSw4monWqKHNhLqc8D3Nib2n3R2aUEXckthN9hBann/WHV1XmyJzEctWL2Lnnq0oCrRt3YHBt4zAZPSothhahsKRbgeY/9NCpmWlEBocw73Dn6J+7UbsP7KbZo088DSVHbW1aGLi/IV84uqHuiSGpvbxvOx/koIcJ2SakCQwqyyofNWMjH4Tn/N+JefGxjn4bcWP3HPPBsLDdCSn5hPXtD+D+91Zdu64gp+drg/IxJ89Tl5+DhNG1SU4MBQqsJgn1tvJRynPsnJlNiMGhqBWS2zakcWu3RLNaneg8LSDQI/Sm8e5tmx8dKF0yp1E3oVcklLO4evtR2StmBum7k9rP6DT//7DCpx3YzBCJVRsQCwpilLFgZRXv04jZerb31d7v9VFlmU+mPomheeLiDLUR0IiyXIaXZial5+djFrt/q/rlzIu8u3Pz7Hoh7ol88gAk/97HpU0gl6dLz9ivx7JqUl88+Nn5GXmoZJUaEwaHrrvMRrWLb8RNUB+QR6Z2RkEBQTjYar+uvR2h539R3azfutCLJZUtFoVNquenCyJosJC8vPzaGBsToRvbfLtuSTJ8dxx132kZyZx4OhKmjcxkHTBjkoKZ8yoF/Dx8q321yDUTAPu7bJXUZQ2VzvP/RmmBjpx+giZyRnEeXQuGbE19GjBwbTtHDlxkBZNW7s5QggODKV2ZEdefGc34+4LwttLw/I1mezap+fphyu24qWiwsOieOvFD0m5eB6n7CQ8LAq16splbL08vfHydM/G0kdOHOD72dPQ2rXIioKi96Z9u85s2bCRhro4fH39uag7z8HcnaRbkqkdU4+xfR+nyFxIetZq5n1XG29PDYqi8P2cFOYvmcbY0S+55bUI/14isVeB5IsX8JB9y3wNlyQJT6cPKWnnXZrYLVYLJ88cQ5adNKzbFJOx4nVh7hj8COu3RvHyf1ZjtVmoX7sNj44ZWSXTRZIkER52Y6/CyM7NYvoPn9NQFYevofiR/HRLKr8vmU8r38746vwBhVBTJJ5ab06pD/HchNdQqVRMm/U648f44+1Z/CslSRL3jQpjwdIj5OXn4u3l8w89C4JricReBYICgjGry9dnMasLCPSv2IM9FXEs/hDTZ3yOweGBhEShKo/7Rj9MmxYdKnS9Wq2hb7dB9O02yGUx3cz2HNiOrzOwJKkDBBnCMNg9yS7IxJ4lI8syOp0OXx8/CqwF2B129Do9VlsRvt5lf520WgmTUY3FahaJXahW4gGlKtCsYRx6Xw1nCo/jkO04ZAfnCk8geUOci0brReZCvvn+M+orsTQ3tqOZsS1NVG2Y+dN0snIyXNLH5eQX5mGxuLZK4Y2iyFyIRi6/05JO0pNReAkjJrzUPqjsahLSz+Bh8kCnLb75XDe6DcvWll0ps/9wHrLsTaB/cLXELwh/ccmIXZKkW4CpgBr4TlGU913R7s1Ko9EwccJr/LJoJjuOrAOgWZMWPDrsSbRa16wdPnh0L55OX3xNpaNLL60PfrYg9h7aSd9uA1zSz18Szp/lj9XTycpJwilL1ItpzbBbx7ptLrwqNKrfjA1r1+NUnKj/t8zR6rCSJV9Cq9KRqVzCB38KyCVJiaeBf8OS6baenQbw1cydvPZ+It06mkg8b2PRcgvDb3te7LUqVLtKJ3ZJktTAl0Bf4AKwW5KkPxRFOVbZtm8UTtnJkeMHOHX2BL4+frSN64iPt98/XuPr48f4B57G4XCgoKDVuHbPTavdikopfwNSJauxWq0u7SsnN5tZ8yfz/AQvenRqgMUqM/PXE8z49X2eePA/Ll/SZ7GYSc+6hJ+PP54e11fC+Ho0qNOYxrFNOHhwOyFSBLLiJNmZgMnkQUvvTpzOPcZ52ylMGk/qeTRBtpdWi/T08OLJB99lx/7NLF5+DG/PYB65p1fxEktBqGauGLG3A04rinIWQJKkX4AhQI1I7Ha7janTP+DiuYv4OAOwqawsXf4bjz8ykfq1G131eo2mam5jNKnfnIXSXGxOKzp18UMxDtlOtjqdZo1auLSvnfs30q+nhl5dir8dmIxqxo+pxZad5ziXdJo60fVd0o+iKCxbs4hVa5ehx4BFMdOhXRfuHDqmUu9j6qVk8vJzCQ+N/Mc/FJIkMfaeCeyP282efTtQq9X0jevPj7On4aHxon1wj5JzEwpPEh4VXeZ6g8FIj479gH7l2rY77CQlJ6DVaG6o9e1CzeSKrBNO2ccdLgDl6sJKkjQOGAcQFOC6G4hVbfOO9WSczSTO1KnklzHdksqMn77mnVf+67av2cGBofTrO4C1a1YSJNdCQiJdSqF9p05ER7h2Q4ecvIu0aVl2CkmSJOrW1pGVm0kdXJPYt+z6k/Ur1xJn7IxBbcQu2zi8fT9GwzyGDxp9ze3lF+bxzYypJCUkYlSZKFIK6N93IAP6Dr1iYlWpVLSObU/r2NKPcHKvJDasXkddXRM8NF6kmZO5pEnmwV7jKhTH4eP7+W3Fl9QKlSkyO7Fa/Rg9bCLhoZHX/JoEoSJckdgv9xtS7qknRVGmA9Oh+AElF/RbLfbs20moOqpMIgjUh5KQe5K09FTCQtyzRRzAoP7DadKwObv3b0eWnQxvMYKGdZu6fDRYK6QeO/bsZmDf0mM2m8z+w2YevMN1SxjXrl9BbW0jDOriSo1alY4GxuZs3LqO228bdc0Pds38eTr5Z4to59ETSZKwOi2sXbWKWmERnJP8y50/vFm9y7YzsN8wvL19WLt+Bbl52dRr0IhnB7xcoZ99RtYlFq34hDdf8aVhPQ8URWHD5hw++vp1Otw2CdUN8LCaUPO44lN1Afj70CMCSHFBuzcEtVqDrJQvbyojo1Zf+SGb6lI3pgF1Yxpc/cSrsFgtHIs/hN1uo1H9ZmWelmwb14Wp3y3hs2/PM/iWAAoKnXw3J52YiI6EBlesymNF5OXnEqUpO72lVxmxm+3Y7fZrSuy5+TmcOHmUdh69Sv7Q6dUGIlV1+W3ZEoZ96Yfxb+UUzEU2Fq4YfNnkrlKp6NGpLz069S33b1ez+8AWBvXTE9vagUpVvMvTbUPUrNiai6nez9RtVbkVM5aC4m3uDJ7/fA/H6ZBJOJRBYa6VWvV9CYyovnsXggt9ULHTXJHYdwP1JUmqTXEljjuBa//efIPq3Kk788/9TKAcglpV/HYlmxMICg2+qaaU/snJM8eYu/hDYpuoMRnh02+tdO94Nz06FpcVMOgNPDZmMms2/cZTr+xErzPQosmddO9Ufi65MhrUa0za0WSiPUqTa4b1IqEhYej117brkdlchFbSlqxu+YtBbcRsvohaG8iYxgNLjs88vrRywV8pDkseIUFqJAkCDKVr2euHF9LUtwW3Nr6+5a/JFzKZ+tE8Thw7Byg0aFSbp54bVbLb1N8lJabz8nPfEBZkJSpMzfZVibTp0IpnJ40QK3ZuMhP5pULnVTqxK4rikCRpArCK4uWOPyiKcrSy7d4o2sV1Iv7UMXbv3ogvAVglCyovhafue7FG3ACz2qzMXfwRU173p0XT4qWL6Zk2Hnr6J+pENSIqPAYofsx/2G1jgDFVFsvg20bw4am3cRba8dMGkWfP4aIqkfFDn77m9zooMAStSUu2NQM/XWmyu2i7QO3GjYEiF0d/eXWjm7N6wwZuHVa6EUhevoMde8zc/cj17V5ktdp54emvGD1ExWdvFd9PWbwsk0lPf8X3c14ss2euoih8MPkn7h+pYujA4i/WFovM45MOsGpFXW4d4P7yFoLruWSCT1GU5cByV7R1o1GpVNx3xzj69LiNs4mn8PL0oWmD2Cpb7VJVjsUfZsnyhSRfPE9IYBgDbx1Ki6atOX7qME0bSiVJHSAoQMewASb2H9lWktirQ3hoJC9PnMyaDctJSDxLaEgt7ul5L1Hh154A1So1o0c9wA8/TiO4IAKT2pNMOQ38HbRs2QOnfQlnC45Xwasoq1njOHbsr89zr+7h7tttmM0yPy3Ip3WfJpi90zhbkHbNbW5bd5rIiEKGDq2FjA2AwYO92LwnhXkrV9K1b+nN7IsXckm7dJ5bbonGKhfvkiXpYPRIEz/+sYaG3StegkK4edxc2cmNaoVEUCskwt1hXJdj8Yf5evqnREsNaanvQu6lLL7/YRr33TcWUDAay4+GjQYJp9Pmkv4VReHUuRMcPLIPjUZD25YdibhC3ZjgwFDuHvGgS/qNa9qG5595nU1b15GZlUH3hj3o0r4nJqMH36fXZ1+6429nR9Na7/pKkmqVmgfvfIH3jk7l1Z/OImk0eLduw9lGkby/xXH1Bi4jYWset4SquZhfdg1CSC01P23JZauxtN2CizYKnRJpBQp//9JTKEscT7VfdwzCjU0k9ipQUJjP8VNHAGjaMLZaa7Bfzu/L5hMjNSLEWLyKI8gQhtqqYfGSeUx6+k2WrLWSmmYhLKR4HttidbJktZlenYurgxaZi9i1bysXkhOpFRZB+9ZdKlxOV1EU5i6awa7tOwiQQ1GQ+XP9am4fMpJeXV1XGvhKImtFc/fI8n8oHrJcpj6Oa1ZtlqPVaHm9xXPw98cLKvEM2fGg2mzaEY//PT6oVMXZWpYVDu/K5q7Wg2lqKe1I9paZYt3F2X0S7Vv5lpy7dkkOfWuPpLflxtvOT7iyRRW8eyoSu4vtPrCVpWu/pm1LPYoMS9fauP2WCbRs1s5tMSWnnKetvkeZY366QI5k7MJoMNGv2/08/OwMbr/VhIdJYukaM4F+nWhUrymZ2RlMmfommgI9noovJ6QTrFjzB88/+XqFnqo8kxjPru07aGnojEZVvHIj3BnDot/n0Sq2Pb4+//wEr1Bew7pN+HNbHd76KIHRwwORkJj7WwYWaxSN6zcvc65KpWL4gAm8MeV9+nTLJypcw/otFgoLYxg7+urbBAo3J5HYXSgrJ4Pl67/m24/DiY4svll2JqGQxyZ9Qd3oz91W4S8oMJicrCwC9aWrePLsOfj6+KFWq+nctjd1ohqx99BW8gtyUJHP8eNn+W/yu1hsRXjk+VHXs3HJtQmF8cxb/BNj7hzH7yvms+/ALtRqNR3bd+W2PkMx/G0Fy6Gj+/CXQ4qTuqJQaC7EbDGjdmrZtHMtg/uNrNb3wul04HA60esqtoWdLMtcTE9BQiI0uNYNccNcpVLx0F0vsm7LUl5+ZyMKCk0b3MrY0YMuu8qlfu1GPD32E3Yd2MaeA5nENm5MbOOWN8SGL0LVED9ZF9p/ZDd9u+tLkjpA3RgPunbQcfDYHrq2d88IacAtQ5k963s0kgYfrT/5jlzibYcYNmRUSaIKCwmnW4f+/OfjVzHkeRKii8KcVcTx9GPU8W5Ypr0IYx22HV3FlM/eQpWhpbGhDbLdyZ51eziXeJZnH325pF2tVouME0VRuJRxEbvVjgYtFtnM70sWEOAXTOe23av8PbBYLSxZPZuDxzchy3ZqhdRlYJ8HiYmse8VrEs6f4buZX1KQW4CiKPj4ezN2zITrupnranqdntt6Dee2XsMrdL6Pt5/LC8MJNy6xiNWFHA4HxssstzYZJewO992katOiA3eNHsMF02m2FK7krPYoQ0eMoGuHXmXO27B1Dfp8Ew08m+Oj8yfUGEEDVQvO5cdjl+0l5zkVB3anDXuWgwaesZg0HnhqvWni0YoLZ5M4m3iqtO+4jmSqLpJZkI7dasek8sSKGavKTGuPrvy6YFa1lAGes2gqgQE7WPh9NGvnN+KBu/KYOX8ymdmXL3FcZC7ks6+n4J8bRhtDd9oae+CdHczUaR9gsVqqPF5BqAwxYnehZg1bMHvRr9wz0lGyk052jp11m82Mu9u1hbmuVYfWXWjfqjN2uw2tVnfZKYX4U8cJUJd96MrfKxB1roZ8ew7++iAUReGs+Ti1QiMwpJct2StJEl74kZJ2vuRp2LDgcEaNuIfpP3yOp+yLSlFRKOURF9gBH50/RosnZ5NO06RB2blhV7p4KYX0rMN8/WFdNJrisUyfboGcOmtl2+41DOp3FwCZ2Rms37SSswlncDitaAsNhHiXlg0IM0aSVZTGgaN76NCqS5XFKwiVJRK7C4WHRdG84UAefGoZQ24x4nTC7yvNtG0xrMrLt+YX5HEmMR6D3kD92o0uO38qSRK6v80tn0mIZ8Wa30lJTSY8PBK1VkWhM59ASmP18vLGWWTnhG0//nIQBUoeEXUjiWvRhnWL15RpX1EUCskrt0tU1w69OHHqKCd3niTUEEGQIQyNSouiKNgVK0aDkaqUkXWJujGGkqT+l8YNDBw6lgxAWnoqH3z6Jj7mQPy0QZzOPwpFEha9GYO+ND6tU09+QW6VxisIlSUSu4sN6HMnTRq04dDxnYDEHYM7uLza4v+3dtMKFi+Zhzd+2LGh9pR4Ytzz/7jH6PFTR/jqm0+IUOoQrWtE9rEMEuV4nLIDH1sAvjp/HLKD0+ajtGvXiSG3jSA1LZmQoDCiI+pgsZpZtWYJCQXxRJrqIitOEszx+Ib60LBuk3L99ezaj8MHD+KnDyxZHZNiTsTkZ6ry9ycsJIJFK8yYLU6MhtISA7v3mwkJLC5f8MeKBfhbQqntWXo/YX/RdjKy0kvW3DsVJ3nqTOpGV742jyBUJZHYq0DtqHrUjrp8pUBXO5MQz5I/FtJS3xmDuvgpwtT8JL749mP+8+onV6wFsvD3udSRGhNsKi7i5an1RmvWkuGVQoLjOHazDYfiIDa2JfeMGovJaCpz09BoMPHcE68xd+FMtp9cjSSpaNmiDXcOG3PZPuvFNGTIkBEs/mMenvhgx4reV8eEh6t+h6EAv0Aa1u3GS//Zxvgxwfj7aln1ZyZ/blXx9Nji+wwHjuzFaPHigGU7QcYwQg0R+Br9OVG0H02RCkmSSHEm0ii2abX9bAXheonEfpPbvmsTwUpESVIHCDNFcTE/ibNJp6gX07DcNYqicD45gS5/W8IIEKQP43TuEd6Y9D7rtqzCarYQ27xVyb6e/19wYChPPTIJu8OOSpKuunyud9dbaN+qM6cSTqI4ZZo2jL3m4l7Xa8TAsfy5tRYvvbMaizWLejGtePS+kXh5erNh6xpyM3MwOf0wSAbOFsVzQZ9AM782bNesQY62opJUDG03gg5tut4QSx4F4Z+IxH6TKzKb0UjlE68GLdYrrN6QJAkfb18KbHl4a0vL8+Y78tDrDLz70ev4O0PQKQaO7/+JDTFreOqRSVfcr/Vatv07cuIAC3+fi6XIgqSW6Na5F0MH3FGla6pT05L5Y8UC4k8dx9vbhz49h9OpbXckSaKwqICFi3+mrVd3LHlWjJKJIGpxzLqHg3nb6d97IHcOq7rCZ4JQFcRyx5tcXIvWZCgpKEpp3ZBCRz5Fqvx/3LKuX++BnLIepshRCECRo4DTtiMUmgtoqIqjvkczoj3r0cLYkfSzGWzdvbHSsR45eZC5P8+itq0JHUx9aKHpxK4NO/lt2a+VbvtK0jPTmDL1LTIO59CYNvhnhbHwl19YtmYRUPxkrKfkS6B3CJ7eXhQpBZiVQjwVX/R+OoYPusvlMcmyzLH4wyxe8StrN60gJzfb5X0I/25ixH6Ta928HdsbbOJA/DYCCcWm2MhQpXDHHWMwGq5cua9Xl/5YrRZWr1sGRSBpJdp27sC+7Xvw1QWUnCdJEqHqSPYf2H1dG0383ao1S4hS1cNHV7x7kUFtpKGxBZu2rmPwLSPKrNhxlbUbV+BnCSbGs/iPnFFtwqTxYtXaZfTudisGvRG7UlzszNfbD29PHxwOOxZLAQ1atbzit5Tr5XQ6+ObHqZw+fgpfZxB2lY0lyxbw6MPP0KheM5f2Jfx7icR+k1OrNUwY+xwHj+3j8JH9mEwedGg7lsha0f94nUqlYkDfofTrOZD8gly8PH24lHGR3Tt2oihKmXlku2LHU18+6RaZC/lzy2r2H9yD0Wiie5detI7tcMU56IzMdGpryq6YMaiNYFVRUFSAfxUk9nPnzuCvLbtLkUFtRG83kJ55iXoxDdF6aUjJT6KWMQqVSoVDZSdTk0qndq6pMvl3u/Zv49zRc7T06IJKKv7CnGVN5/tZ03j/jan/2sf8FUXhdMJJUi5eICgghEb1mopNQCrh3/kpqmHUag2tmrejVfOyhcbMliJOnzuJVqulXkwjNBoNNpuVInMR3l4+qFQqtBot/r7FG1HUConAL8if5EsJRJiKV8DYZRupSgL3dyi7cbPFauHDz97GluYkVBuJTbYy5+xMEnsmMHzg5acv6tSux6WDF/HQlm7LlmfPQWfU4ePte9lrABLOn+XAkT2o1SpaNW9HeFgUiqJwNP4QO3Ztxmaz06ZVO1rHti+XGENDw7iYko6fvnSzDYdsxyJb8PPxR6VSMWHcc3wx/SPS8pPQSDqy7JcID4vkl4WzadSgMT269CuzVWBl7N67g1B1ZElSB/DXB5FgPklScsK/csWNxWrhh18+QFHO0rqFju177azaEMzY0a/i5el99QaEckRir4FkWeb3lfNYsnIRXmpftGotGJ3Ur9eII0cPgSxh9DAw4va7adeyU8l1kiTxyP1P8tk3U8jIS0WHgVwlk169+hPbpFWZPnbt24rlko2mHm1KRugBcjB/blhN7663XLZq4239bmfKsbegEIL0oeTbc0mS4xk17F7UqsvvH7t4+a+sX7+GAGcISLBm9QoGDhxGQWE+m9f/SQiRqCU184/NZU+THYx/4JkyI70+PW7lowPvYLJ4EqgPxSpbOGU+TLv2HUqSRnhoJP959RPOJMZz4MgeNm1Yjz7NC6PGg71Je9m2czMvP/s2Pt6Vr0SpVquxKmXr3CuKgozzhthD1x1Wb1hEg7qJvPJ0bVQqCUVR+GZWCr+vmsE9w59yd3g3JZHYa5j8wjw+/Oxtzp08i78UTAG5eOi9oEBhz/nddKjVC4PGSK41i59++gEvT28a1y+d2w0NrsXkVz7m5OljFBYVUCe6PgF+5ffRjD91HD8pqMy0i1alw1vlR+KFs/j6lN9yLTw0kheeep1lqxdz9txR/EMDeKjvY8Q2blXuXIDzKYmsX7+GVoYuaFXFc90Rzjos/v1XZBQ6ePQuOR6qRLL/+FaOnTpMs4al5Ruiwmsz/uGn+WXhTOLTD6HWqunavSdDB9xZpi+VSkXtyHp8/f2nNNG1KVktFKAPIT7vEGs2LmfEoLsr+mO4oo7tu/LT8RkEy7VKHtRKsyTj4eNBRNg/T5/VVIdPbGDalOCS2vKSJHH38BAGLd6J0+n4105PVYZ4x2qYeb/NxpxkpbnUAaPahKIonLQcJEu5SHNVBxSHAhrw0fkT4ajL6nVLyyR2KN7152q1W/z8/EmWL5Y5pigKZrnwH8sTh4dFMW7MkxV6LUeOH8DfGVSSvKF4ftzD7kMRBWWOqyQVfs4gjp88UiaxAzRp0Jy3XvwQs8WMTqu74raG6VlpyFYFb2PZaZcgXS2OHT8Cl9mb41q1bNaWE52OsH3bRvwIwqayYjdYeeqBSVUyp5x88TyHju1FrVYT17RtlZe2uB5O2YlGU/a+jFYrAQqKcvlrhH8mEnsN4nQ62HtgF/XVsThwolB8EzRYFU6mPQ2NWocsyyXne2l9SMk8c119denQk42b1+NvDcJfH4SsyCQUxRMQFvCPpXCvhUqtRpbK/2YrKpAVZ7njDsmOyXT5lUCSJGEy/vP+nh5GT+yKDafsQK0q/dUwO4rw8XZNLX1Jkhg9/EF6dunP6YQTmIyeNG8UVyUrglZuWMj+w79xWx8DDgdMnzOP7h3uo2v7yq1ucrXG9TuycOkOJjwUWXLs95Xp1ItpcdPtLXyjEO9aDWKz28nPz6XQWggy2Jw29BoDRkw4sFGo5BGqDys5P9N6kTrNr28/uJCgMMY99ASz537HmcKjOBUHtevU5cF7nnHZk5ktm7VhydJFFDkKMGmKt+LLs+dg1Rdi1Bm4aL5AqLF4H9pcWxZZmjTaV6LqoreXD82atuDUkaPUNzVDLakpchRwQTnDwz0ed8lr+ktYSDhhIeFXP/E6Jacmsf/wb8z6IgZfn+IpnxGDrNz/5EyaNWqNn49/lfV9rW7pMYqvZx/jbGIi7VppOXzcwcEjWsbd84C7Q7tpicRegyxdvRCVU02BlEuIKhKH7MDqMJMmnUetU5OiP4uPzQdPrTfp1lQy9Kk81OeR6+6vWcMWvPf6VNIyUtHrDPj7Blz9omsQHBjKXaPu45f5/9fencdHWd17HP/8ZjJL9pCQhJCFVfaySNgVEBeoWtSiFSvCLQq1amuvtvZ6tfZW6315q632dv3Qf0UAABOPSURBVHGr3qIVvdVqxaWylLUKCEqAQIisgQAhkIQkZJnMcvpHIhITSEImmczj7/165fXimTzPM98ZJr85c54z5ywiri4JxFBpK2P+3O+RlNidp194iiOV+7FLBF5HHbfdcifdE5PbdZ9zZy/g/155mo93rcRti8IrHq659nqGDRoZpEfVObblfcqVl7lPF3WAHikupk50k7trS8gWfWlObEwcP7ztMbbs2EzO9gK6J/bk3u+Oxd3Bs35amRZ2i/B661j34Sqykyaz5cR6qgOVRNliKQ0UUx5Rwv33PIwgLF3xLvvKDtF/8ADmT19AWkr7Wo02m40odxQlZSdwOpzERMe2fFAbTBo7la8NHsWOz7Zht9kYOnDE6YW0H33wSQoK9+H1eemT1b9NUxucTVRkNHfe9iNKT56gorKCHik9Gy31Fy5sNht+f9NPTl4fRLq63ugbh8PJ2JETgYkt7qtapoXdImpqazB+Q2JUMpPTZnC4uoBqbyXJkorDZaNXRl+6xScyYmjT0Srny+vz8srrL7D5k41E2WOo8J5kwIBBXDb56wwZMDxo/aNxsfFMGH1xk9ttNluHjftOTOh+enx/OBo5dAzPL/4L13/DQ2pyff99waEa/rnRwz0LR4U4nepoWtgtIiY6luiYGE7WlpDgTCIjqjc5JRs4XlNErCuOnz5yLxPGXczsWfOaHTPu8/nYuXsbZSdL6ZXRl14ZfVrsK1/y99fZtSmP7Mgp7D+VT1HFEfI35LMvdx9RSZHcfft955wTXnWc1OQ0Jo+7hXnff5lLJrnx+mDdBg9XXXp7yBZVV51HC7tF2Gw2rr/u27z00vNk+PpTVH2Iuuo6htqzSUvKQGyQs34Tqak9uGzylY2OPVF6nCf/8Cjecj/uQDQVUsqAIYNYOPcHZ211BwIB1ny4kuGR4ynzllBYUcBI2yRs2KjzeJAqw9MvPsXD9z+hXw0PkcnjpzNs0Ghyd23F5bDx7wtHBe0btKpr0784C8keMZ47vncPzn5wxFNAn+hBpPXIwBHhIMLmoLdzEKvXrmhy3KLFzxJdlsCIyAkMjB7O6MjJHMg9wOqPlp31vvx+H3V1Hty2SA6fOkAaWTjEiQ0bgUCAtMhMqk9Wc/Dw/o58yGGnoHAf7y5/k6Wr3qH4RFHLB7RTYkJ3Jo+/lIvGXqJF/StEW+wWM6j/UHpn9mPX7p2kRqc1mpPEZXdTXV3VaP/KUxXs27+H8VFfjJKwiY1MRz8+2rC2Sev+cw6Hk8z0XhwrOozf+LFLffeO13hxu92ICHYi8Hq9HfAow48xhjfeeYV1a1cT5+1Glf8Uf/3bq8ybs4BJYy4JdTxlMdpityC3y01WRm+O1RQ2uv1oTQHDhjUetuf3+xEE+dJLwSY2/P6mXwI6042zbqFA8hG74WjgILX+arxSR0JCIuV1ZfgcdfTOCs6XlTpaWXkpb773Kr/8zc9Z9OqzHDx8IKjn31ewm3VrVhNf151DFfvxVnvxVxh++8wTFBTuC+p9KaWF3aJuun4ehyL2sKdqB0U1heRXbaUipoSZM2Y12i8hvhtpPXtypObg6duMMRyuO8CY7AnnvI/+vQdy/70PM/LiCzEJPva4tuONreGAJ588/6fM/faCoAxB7GgnSot59IkH2LpyG64jcRRuPsoTTz1Cbv7Wsx5TXVNFUfERvL7WfSLJ2b4Zl8fN0cqDDLdNYKBtJCNsE0n39+V3zz/RaKEUpdpLu2Isqk9Wfx788aOsXb+SoqOHGdRnPBePm9bsiIi5Ny3kyd//NxXVJbj8UVTYS0nMTDxrN8yZ0lLTmXvjAm6+YT65eTnszN9OTEwM4y68qEvOS9Kcd5e+RVxVd/o1rAHb3ZVKjCee115fxCMP/Krx3PQ+L39562XWf7wOB05MRICZV85i2sUzznkfNrudUk8JPemDU+qHH4oIKZLOvtJcjh0/So+Unh33INVXihZ2C0tOSm00N7rP52NTznp27tpOTEwsE8dMJi01ncyevfjFg79mU856SstK6J3Vl+GDR7VpVj27zc6IoaODOk6+s+Tl59LP3XgitCRnCrvLtlF5qqLRm+Gb77zK9vXbyI6agsPmpMpXyZK/vUlCQmKT+fDPNHrEON54czH2M/7k/MaPsRmiXTHUnmV9WqXOR7sKu4jcAPwXMBgYa4zZHIxQKvi8Pi+/efYxju07RhKp1JmDrFmzgrk3LyB75HiiIqOZMuGyUMcMibiYOGqKq4mO+OJbs15TBzZwnfGt07o6D/9cv5pRkV9MIxwdEUsv3wCWrXivUWE3xrAjfyvrPlqFx1PLhSPHcuHoMezauIsofzSIEBAfzjgnuAwZOt5fBVF7W+y5wDeBZ4OQRXWgjZ/+k+K9xxkRPeF010Kytyd//v8XGTH0wqCv7Rlqxhg+25fHzl3bcLsjyR45nuSk1Gb3nTZ1Oq8vXkysPx6X3Y3f+NlTk8u4cZNwnTHrYo2nBvzgcjeeYiA6Ipai8oJGty1Z+garl6+gB1k4bE7e27OEblkJ9ByUxuHCvSRJD4zDzxH7Xv5t9nd1FkMVVO16NRlj8oCgzeZnZT6fjw83rWLn7jUYYxgyYAoXjZnWaX/QW3I2k2JPb/R/FedIwFHj5EDhPi7oM6hTcnSGQCDAn159hu1btpLoT8Fn8/H+B28zb85CskeMb7L/+NEXc6LkOMtWvItboqnxVzF8+Ci+de0tjfaLjY4jOi6GspoTdHN+Md1AsecoFwweeHq7rLyU5SveZ7R7Mk57/RtDiunJ1oPr+eZNNxII+MnLzyU+LoFJ479Hz9SMDnom1FdVpzUTRGQhsBA4a8vJqowxvPTGk8TE7OCuW+uXV3vtrcUsen0L82ff1ylvjJGRkVQFyk5v+42fk54SqryVYTFypS1y83PI/XQbo6IuOj2+vtKbxcuL/8iwQSObTOolInxj+iwunTyDY8ePkhCf2Oy0tjabjRuuvZlFLz9PurcPsY4ESrzHKHUWcev0Baf321ewm3hb4umi/vl9JJLK7r15zL1xIZPGTu2YB68UrRjuKCIrRCS3mZ9r2nJHxpjnjDHZxpjscy1cbEV7DuRTXbOdxx/qxdhRCYwdlcAvH+pFrWcnu/fv6pQME8dNoYiDePy1HK0+xKrD77C1eCOnKk/xwst/4MixwpZPEia25GwimfTTRR3qFxWJNDHs3pd31uOiIqPpk9X/nHOVjx4xjrvuuJfowS6KEwroPS6L++99uNEsmdFRMXhM04uhddQSq/O0qE7QYovdGPPVvKIWRPsP7mHyBBcREV+8j0ZE2Jg8wcH+g3sY0Hdwh2cYMuBrXDHjKpa8/wblZeUMkOFEO+JI7p7KibKj/O8z/8OjDz5pifUlIyIcza6wFDD+oDy+AX0Hn/P/7IK+g3DGOSgs3096ZG9EhPK6UkpsRUwcc1e771+plugXlDpBXGwCBYWBJrcXFBriYjqvBXfl5dcybeoV9IkdQFZKX9LTMnE6nPSM7IX/lCF/785Oy9KRxo6eSLEcps7vOX3bCc8x/C4vF/Tt+GsJdpudH3z3PmqTK9hcs4ac2g/ZY9/Od+bdTmpyWssnUKqd2jvc8Trgt0Ay8J6I5BhjpgclmYWMHJrNL/+wiOVrTnDpxUmIwD/WlfDpVuG+O8a0+/zGGHJ2bGbVmmWcOlXJsGEjuHzKVcTGxDXZ11vnI8YRh9vVeHUaJ26qvjSPTFfl9Xmx2WzNTj8M9S3my6fP4IOl79JNkvGJl1pHFXfedm+nXU/okdKTh+57jCNFh/DUechM7225axmq62rvqJi3gLeClMWy3C4382f/lGdf+g2/f7F+8eiIiBS+M/tHQVn+64OVS1j2/vtk2PqRZE8n5x85bP50I/95zyNNVjQaMuhrbNnwCVmm/+mLtnUBD+WmhH69B7Q7S0c6XHSI1/66iN1787HbbYzLnsT1M+c0u0j11VfMYnz2ZPL37sDlcjNsYNOLph1NRHQ+ehUS4d+hGiYy0rK4Z+ETHC85BtSPDArGaJjqmireX/o2I92TcNvr3yQSnEnkndzCuo2r+Pq0mY32Hz5kFKv7L2fr7g30sGfgC/g4SgGXX35l0NcsDaaKynJ+9dtfkOLJZFL0FfgCPnZvzOPpE7/mnjseaPa57J6YTPfEqZ0fVqkQ0z72TiQipHTvQUr3HkEb4lh49CBRxJwu6p9LsqWSn7+jyf52ewR3Lfgx186ehbO/0G14LLctuIOZ068PSp6O8tGmNUTXJpAZ1Reb2HHaXQyMHsGh/Qc5dORAqOMp1aVoiz3MxccmUBOoImACjeZerw6cIjOx+YWqHREOJo2dGlZjqYuKjhJD42sGIkKMLZ7ikmNkpfcJUTKluh4t7GEuNTmNPn37sWfvDvpFDcEudk7WlVAkh7jlonmhjtdmxhg25XzEP1Yvpbz8JIMGDuGqK64jK6s3uz/ZDXxRwAPGT0WgjPTUzNAFVqoL0q4YC1gw7/ukDE7i45qVbK5ZzQHnLubPuz0sW7EfrFzCqy+/ROTRePp6hnJo02Eee/JnDOw3GH9cHXtP7aTWX02lt5zcqs0MGTaMtNTmP5ko9VWlLXYLiImO5c7bfkRFZTnVNVUkd08961DArqy2tqb+QnDkRNz2+pEufR2D2X0qwEeb1nLf3Q/x9vtvsC33Y5wuFxddMpUZX7o4rJTSwm4pcbHxzS6kES6KS4pw4T5d1D+X5Ehhz57PuGHmHL7z7dtDlE6p8KFdMarLiI/rRm2gBl/A1+j2Sn85KSlfrYnjlGoPLeyqy4iPTWDUyGzyq3OoC3gwxlDqKaZICrh0yrmXnlNKfUG7YlSXMudbt/G6689s+HgtEhBiE+K4ddad9M7sF+poSoUNLeyqS3E5Xcy54VZuuGYOtbXVxMbEY7PpB0ul2kILu+qSXE5Xo2XplFKtp00hpZSyGC3sSillMVrYlVLKYrSwK6WUxWhhV0opi9HCrpRSFqOFXSmlLEYLu1JKWYwWdqWUshgt7EopZTFa2JVSymK0sCullMVoYVdKKYvRwq6UUhajhV0ppSxGC7tSSlmMFnallLIYLexKKWUxWtiVUspitLArpZTFtKuwi8jjIrJLRLaJyFsikhCsYEoppc5Pe1vsy4FhxpjhwGfA/e2PpJRSqj3aVdiNMcuMMb6GzQ1ARvsjKaWUao9g9rHPB/4exPMppZQ6DxEt7SAiK4AezfzqAWPM2w37PAD4gFfOcZ6FwEKA5KTU8wqrlFKqZS0WdmPMZef6vYjMA64GLjXGmHOc5zngOYAL+g46635KKaXap8XCfi4iMgP4CTDFGFMdnEhKKaXao7197L8DYoHlIpIjIs8EIZNSSql2aFeL3RjTP1hBlFJKBYd+81QppSxGC7tSSlmMFnallLIYLexKKWUxWtiVUspitLArpZTFaGFXSimLkXPMAtBxdypyHCho2OwOnOj0EMGh2TtfuOYGzR4q4Zq9udy9jDHJLR0YksLeKIDIZmNMdkhDnCfN3vnCNTdo9lAJ1+ztya1dMUopZTFa2JVSymK6QmF/LtQB2kGzd75wzQ2aPVTCNft55w55H7tSSqng6gotdqWUUkHUJQq7iDwiItsa5nRfJiI9Q52ptUTkcRHZ1ZD/LRFJCHWm1hCRG0Rkh4gERCQsRgyIyAwRyReRPSLyH6HO01oi8qKIFItIbqiztIWIZIrIKhHJa3it3B3qTK0lIm4R+VhEtjZk/3moM7WViNhFZIuIvNvWY7tEYQceN8YMN8aMBN4FHgp1oDZYDgwzxgwHPgPuD3Ge1soFvgmsDXWQ1hARO/B74OvAEOAmERkS2lSt9idgRqhDnAcfcK8xZjAwHrgzjJ5zDzDNGDMCGAnMEJHxIc7UVncDeedzYJco7MaYijM2o4Gw6fg3xiwzxvgaNjcAGaHM01rGmDxjTH6oc7TBWGCPMWafMaYOeA24JsSZWsUYsxYoDXWOtjLGHDXGfNrw70rqi0x6aFO1jql3qmHT0fATNnVFRDKAq4A/ns/xXaKwA4jIoyJyCLiZ8Gqxn2k+8PdQh7CodODQGduFhEmRsQIR6Q2MAjaGNknrNXRl5ADFwHJjTNhkB54C7gMC53NwpxV2EVkhIrnN/FwDYIx5wBiTCbwC3NVZuVqjpewN+zxA/UfXV0KXtLHW5A4j0sxtYdMCC2ciEgP8Ffjhlz5dd2nGGH9D924GMFZEhoU6U2uIyNVAsTHmk/M9R7vWPG0LY8xlrdx1MfAe8LMOjNMmLWUXkXnA1cClpguNH23Dcx4OCoHMM7YzgCMhyvKVISIO6ov6K8aYN0Od53wYY06KyGrqr3OEwwXsScBMEbkScANxIvJnY8yc1p6gS3TFiMgFZ2zOBHaFKktbicgM4CfATGNMdajzWNgm4AIR6SMiTmA2sCTEmSxNRAR4Acgzxvw61HnaQkSSPx+hJiKRwGWESV0xxtxvjMkwxvSm/nW+si1FHbpIYQcea+gi2AZcQf3V4HDxOyAWWN4wXPOZUAdqDRG5TkQKgQnAeyKyNNSZzqXhAvVdwFLqL+L9xRizI7SpWkdEXgXWAwNFpFBEbg11plaaBNwCTGt4bec0tCLDQRqwqqGmbKK+j73NwwbDlX7zVCmlLKartNiVUkoFiRZ2pZSyGC3sSillMVrYlVLKYrSwK6WUxWhhV0opi9HCrpRSFqOFXSmlLOZfKwrYRGyEMYMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x18f3da3cda0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#同质\n",
    "classifier = RandomForestClassifier(feature_sample=0.6)\n",
    "classifier.fit(data, target)\n",
    "utils.plot_decision_function(data, target, classifier)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x18f298c7630>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#异质\n",
    "from ml_models.linear_model import LogisticRegression\n",
    "from ml_models.svm import SVC\n",
    "classifier = RandomForestClassifier(base_estimator=[LogisticRegression(),SVC(kernel='rbf',C=5.0),CARTClassifier(max_depth=2)],feature_sample=0.6)\n",
    "classifier.fit(data, target)\n",
    "utils.plot_decision_function(data, target, classifier)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三.代码实现：回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ml_models.tree import CARTRegressor\n",
    "\n",
    "\"\"\"\n",
    "random forest回归实现，封装到ml_models.ensemble\n",
    "\"\"\"\n",
    "\n",
    "class RandomForestRegressor(object):\n",
    "    def __init__(self, base_estimator=None, n_estimators=10, feature_sample=0.66):\n",
    "        \"\"\"\n",
    "        :param base_estimator: 基学习器，允许异质；异质的情况下使用列表传入比如[estimator1,estimator2,...,estimator10],这时n_estimators会失效；\n",
    "                                同质的情况，单个estimator会被copy成n_estimators份\n",
    "        :param n_estimators: 基学习器迭代数量\n",
    "        :param feature_sample:特征抽样率\n",
    "        \"\"\"\n",
    "        self.base_estimator = base_estimator\n",
    "        self.n_estimators = n_estimators\n",
    "        if self.base_estimator is None:\n",
    "            # 默认使用决策树\n",
    "            self.base_estimator = CARTRegressor()\n",
    "        # 同质\n",
    "        if type(base_estimator) != list:\n",
    "            estimator = self.base_estimator\n",
    "            self.base_estimator = [copy.deepcopy(estimator) for _ in range(0, self.n_estimators)]\n",
    "        # 异质\n",
    "        else:\n",
    "            self.n_estimators = len(self.base_estimator)\n",
    "        self.feature_sample = feature_sample\n",
    "        # 记录每个基学习器选择的特征\n",
    "        self.feature_indices = []\n",
    "\n",
    "    def fit(self, x, y):\n",
    "        # TODO:并行优化\n",
    "        n_sample, n_feature = x.shape\n",
    "        for estimator in self.base_estimator:\n",
    "            # 重采样训练集\n",
    "            indices = np.random.choice(n_sample, n_sample, replace=True)\n",
    "            x_bootstrap = x[indices]\n",
    "            y_bootstrap = y[indices]\n",
    "            # 对特征抽样\n",
    "            feature_indices = np.random.choice(n_feature, int(n_feature * self.feature_sample), replace=False)\n",
    "            self.feature_indices.append(feature_indices)\n",
    "            x_bootstrap = x_bootstrap[:, feature_indices]\n",
    "            estimator.fit(x_bootstrap, y_bootstrap)\n",
    "\n",
    "    def predict(self, x):\n",
    "        # TODO:并行优化\n",
    "        preds = []\n",
    "        for index, estimator in enumerate(self.base_estimator):\n",
    "            preds.append(estimator.predict(x[:, self.feature_indices[index]]))\n",
    "\n",
    "        return np.mean(preds, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#构造数据\n",
    "data = np.linspace(1, 10, num=100)\n",
    "target1 = 3*data[:50] + np.random.random(size=50)*3#添加噪声\n",
    "target2 = 3*data[50:] + np.random.random(size=50)*10#添加噪声\n",
    "target=np.concatenate([target1,target2])\n",
    "data = data.reshape((-1, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x18f3f5866d8>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x18f3da71320>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#同质\n",
    "import matplotlib.pyplot as plt\n",
    "model=RandomForestRegressor(base_estimator=CARTRegressor(),n_estimators=2,feature_sample=1)#feature就一列，没办法...\n",
    "model.fit(data,target)\n",
    "plt.scatter(data, target)\n",
    "plt.plot(data, model.predict(data), color='r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x18f2d6dd160>]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x18f3b75ae80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#异质\n",
    "from ml_models.linear_model import LinearRegression\n",
    "model=RandomForestRegressor(base_estimator=[LinearRegression(),CARTRegressor()],feature_sample=1)\n",
    "model.fit(data,target)\n",
    "plt.scatter(data, target)\n",
    "plt.plot(data, model.predict(data), color='r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
